/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.DiasSemana;
import br.com.foxinline.modelo.Curso;
import br.com.foxinline.modelo.Disciplina;
import br.com.foxinline.modelo.Horario;
import br.com.foxinline.modelo.ItemHorario;
import br.com.foxinline.servico.HorarioServico;
import br.com.foxinline.servico.ItemHorarioServico;
import br.com.foxinline.utilitario.Msg;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarHorario implements Serializable {

    @EJB
    HorarioServico horarioServico;
    @EJB
    ItemHorarioServico itemHorarioServico;
    private Disciplina disciplina;
    private Curso curso;
    private List<Curso> cursos;
    private List<Horario> horarios;
    private Horario horarioPesquisar;
    private Horario horarioEditar;
    private Horario horarioVisualizar;
    private Horario horarioDeletar;
    private List<Disciplina> disciplinas;
    private List<DiasSemana> diasSemanasSelecionadasPesquisar;
    private List<DiasSemana> diasSemanasSelecionadasEditar;
    private List<DiasSemana> diasSemanasSelecionadasVisualizar;
    private Date horario;
    private String eHorario;
    private String vHorario;

    @PostConstruct
    public void init() {
        horarios = new ArrayList<Horario>();
        horarioPesquisar = new Horario();
        diasSemanasSelecionadasPesquisar = new ArrayList<DiasSemana>();
        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        eHorario = params.get("eHorario");
        vHorario = params.get("vHorario");
        paramPost();
    }

    public void paramPost() {
        if (eHorario != null) {
            horarioEditar = horarioServico.pesquisar(Long.parseLong(eHorario));
            diasSemanasSelecionadasEditar = new ArrayList<DiasSemana>();

            for (ItemHorario itemHorario : horarioEditar.getItemHorario()) {
                diasSemanasSelecionadasEditar.add(itemHorario.getDiaSemana());
            }

            if (!horarioEditar.getItemHorario().isEmpty()) {
                horario = horarioEditar.getItemHorario().get(0).getHorarioInicial();
            }

        }
        if (vHorario != null) {
            horarioVisualizar = horarioServico.pesquisar(Long.parseLong(vHorario));
            diasSemanasSelecionadasVisualizar = new ArrayList<DiasSemana>();

            for (ItemHorario itemHorario : horarioVisualizar.getItemHorario()) {
                diasSemanasSelecionadasVisualizar.add(itemHorario.getDiaSemana());
            }

            if (!horarioVisualizar.getItemHorario().isEmpty()) {
                horario = horarioVisualizar.getItemHorario().get(0).getHorarioInicial();
            }

        }
    }

    public void atualizar() {
        try {
            List<ItemHorario> itens = new ArrayList<ItemHorario>();
            for (DiasSemana diasSemana : diasSemanasSelecionadasEditar) {
                itens.add(new ItemHorario(horario, diasSemana));
            }

            horarioEditar.setItemHorario(itens);
            
            if (!horarioServico.existeHorario(horarioEditar)) {
                horarioServico.atualizar(horarioEditar);
                Msg.messagemInfo(Msg.SuccessFull);
                init();
            } else {
                Msg.messagemError("Já existe um horário cadastrado conflitando com este novo horário !");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void pesquisar() {
        List<ItemHorario> itemHorarios = new ArrayList<ItemHorario>();
        for (DiasSemana diaSemana : diasSemanasSelecionadasPesquisar) {
            itemHorarios.add(new ItemHorario(horario, diaSemana));
        }

        horarioPesquisar.setItemHorario(itemHorarios);
        horarios = horarioServico.pesquisar(horarioPesquisar);
    }

    public List<SelectItem> getDiasSemana() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (DiasSemana tipo : DiasSemana.values()) {
            items.add(new SelectItem(tipo, tipo.getSigla()));
        }
        return items;
    }

    public void deletar() {
        horarioServico.deletar(horarioDeletar);
        horarios.remove(horarioDeletar);
    }

    public String formatarDataHorario(ItemHorario item) {
        return formatarHora(item.getHorarioInicial(), item.getHorarioFinal());
    }

    public String formatarHora(Date dataInicio, Date dataFinal) {
        if (dataInicio != null && dataFinal != null) {
            return formatarHora(dataInicio).concat(" às ").concat(formatarHora(dataFinal));
        }

        return "";
    }

    public String formatarHora(Date data) {

        if (data != null) {
            return new SimpleDateFormat("HH:mm").format(data);
        }

        return "";
    }

    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }

    public Curso getCurso() {
        return curso;
    }

    public void setCurso(Curso curso) {
        this.curso = curso;
    }

    public List<Curso> getCursos() {
        return cursos;
    }

    public void setCursos(List<Curso> cursos) {
        this.cursos = cursos;
    }

    public List<Disciplina> getDisciplinas() {
        return disciplinas;
    }

    public void setDisciplinas(List<Disciplina> disciplinas) {
        this.disciplinas = disciplinas;
    }

    public List<DiasSemana> getDiasSemanasSelecionadasEditar() {
        return diasSemanasSelecionadasEditar;
    }

    public void setDiasSemanasSelecionadasEditar(List<DiasSemana> diasSemanasSelecionadasEditar) {
        this.diasSemanasSelecionadasEditar = diasSemanasSelecionadasEditar;
    }

    public List<DiasSemana> getDiasSemanasSelecionadasPesquisar() {
        return diasSemanasSelecionadasPesquisar;
    }

    public void setDiasSemanasSelecionadasPesquisar(List<DiasSemana> diasSemanasSelecionadasPesquisar) {
        this.diasSemanasSelecionadasPesquisar = diasSemanasSelecionadasPesquisar;
    }

    public List<DiasSemana> getDiasSemanasSelecionadasVisualizar() {
        return diasSemanasSelecionadasVisualizar;
    }

    public void setDiasSemanasSelecionadasVisualizar(List<DiasSemana> diasSemanasSelecionadasVisualizar) {
        this.diasSemanasSelecionadasVisualizar = diasSemanasSelecionadasVisualizar;
    }

    public Horario getHorarioEditar() {
        return horarioEditar;
    }

    public void setHorarioEditar(Horario horarioEditar) {
        this.horarioEditar = horarioEditar;
    }

    public Horario getHorarioPesquisar() {
        return horarioPesquisar;
    }

    public void setHorarioPesquisar(Horario horarioPesquisar) {
        this.horarioPesquisar = horarioPesquisar;
    }

    public Horario getHorarioVisualizar() {
        return horarioVisualizar;
    }

    public void setHorarioVisualizar(Horario horarioVisualizar) {
        this.horarioVisualizar = horarioVisualizar;
    }

    public List<Horario> getHorarios() {
        return horarios;
    }

    public void setHorarios(List<Horario> horarios) {
        this.horarios = horarios;
    }

    public Horario getHorarioDeletar() {
        return horarioDeletar;
    }

    public void setHorarioDeletar(Horario horarioDeletar) {
        this.horarioDeletar = horarioDeletar;
    }

    public Date getHorario() {
        return horario;
    }

    public void setHorario(Date horario) {
        this.horario = horario;
    }
}